package grisar.gris.struct.bound;

import android.graphics.Point;
import grisar.gris.struct.I_Bounding;

public class BoundHelper {

	//TODO fix code
	public static boolean isColliding(I_Bounding b1,I_Bounding b2){
		
		if(b1 instanceof BoundCircle){
			if(b2 instanceof BoundCircle){
				return collideCircleCircle((BoundCircle)b1,(BoundCircle)b2);
			}else{	//Assumes circle box collision 
				return collideCircleBox((BoundCircle)b1,(BoundBox)b2);
			}
		}else{ //asumes b1 = box
			if(b2 instanceof BoundCircle){
				return collideCircleBox((BoundCircle)b2,(BoundBox)b1);
			}else{
				return collideBoxBox((BoundBox)b1,(BoundBox)b2);
			}
			
		}
	}
	
	private static boolean collideCircleCircle(BoundCircle b1, BoundCircle b2){
		
		Point p1 = new Point(b1.getPosition().x+b1.getRadius()/2,b1.getPosition().y+b1.getRadius()/2);
		Point p2 = new Point(b2.getPosition().x+b2.getRadius()/2,b2.getPosition().y+b2.getRadius()/2);
		
		double dist = Math.sqrt(Math.pow(Math.abs(p1.x-p2.x), 2) + Math.pow(Math.abs(p1.y-p2.y), 2));
		
		return dist < (b1.getRadius()+b2.getRadius());
	}
	
	private static boolean collideCircleBox(BoundCircle b1, BoundBox b2){
		
		if(b1.getPosition().x > b2.getPosition().x && 
		   b1.getPosition().x < b2.getPosition().x+b2.getWidth()){
			
			if(b1.getPosition().y > b2.getPosition().y && 
			   b1.getPosition().y < b2.getPosition().y+b2.getHeight())
					return true;
			
			else if(b1.getPosition().y < b2.getPosition().y+b2.getHeight()+b1.getRadius() ||
					b1.getPosition().y > b2.getPosition().y - b1.getRadius());
					return true;
			
		}else if(b1.getPosition().y > b2.getPosition().y && 
				b1.getPosition().y < b2.getPosition().y+b2.getHeight()){
			 
			if(b1.getPosition().x < b2.getPosition().x+b2.getWidth()+b1.getRadius() ||
				b1.getPosition().y > b2.getPosition().y - b1.getRadius());
				return true;
		}
		
		if(Math.pow((b1.getPosition().x - b2.getPosition().x+b2.getWidth()),2)+
		   Math.pow((b1.getPosition().y - b2.getPosition().y+b2.getHeight()),2) <
		   Math.pow(b1.getRadius(),2))
		   return true;
		
		return false;
	}
	
	private static boolean collideBoxBox(BoundBox b1, BoundBox b2){
			
		if (b1.getPosition().x+b1.getWidth() < b2.getPosition().x  || 
			b1.getPosition().x > b2.getPosition().x+b2.getWidth() ||
			b1.getPosition().y > b2.getPosition().y+b2.getHeight()||
			b1.getPosition().y+b1.getHeight() < b2.getPosition().y)
			return false;
		
		return true;	
	}
}
